/**
 * @file main.hh
 * @brief 迷你银行系统应用程序的主入口点声明文件。
 */

#ifndef MAIN_HH
#define MAIN_HH

#include <iostream>
#include <string>
#include <limits>
#include <memory>

#include "BankSystem.hh"
#include "AuthManager.hh"
#include "UIManager.hh"

// 函数声明部分
/**
 * @brief 清屏函数，跨平台支持
 */
void clearScreen();

/**
 * @brief 处理客户菜单
 * @param bankSystem 银行系统实例
 * @param uiManager UI管理器实例
 */
void handleCustomerMenu(BankSystem& bankSystem, UIManager& uiManager);

/**
 * @brief 处理员工菜单
 * @param bankSystem 银行系统实例
 * @param uiManager UI管理器实例
 */
void handleEmployeeMenu(BankSystem& bankSystem, UIManager& uiManager);

/**
 * @brief 处理管理员菜单
 * @param bankSystem 银行系统实例
 * @param uiManager UI管理器实例
 */
void handleAdminMenu(BankSystem& bankSystem, UIManager& uiManager);

/**
 * @brief 处理审计员菜单
 * @param bankSystem 银行系统实例
 * @param uiManager UI管理器实例
 */
void handleAuditorMenu(BankSystem& bankSystem, UIManager& uiManager);

/**
 * @brief 处理账户操作
 * @param bankSystem 银行系统实例
 * @param uiManager UI管理器实例
 * @param accountId 账户ID
 */
void handleAccountOperations(BankSystem& bankSystem, UIManager& uiManager, const std::string& accountId);

/**
 * @brief 显示账户信息
 * @param account 账户指针
 */
void displayAccountInfo(const std::shared_ptr<Account>& account);

/**
 * @brief 处理转账操作
 * @param bankSystem 银行系统实例
 * @param uiManager UI管理器实例
 * @param sourceAccountId 源账户ID
 * @return 操作是否成功
 */
bool handleTransferOperation(BankSystem& bankSystem, UIManager& uiManager, const std::string& sourceAccountId);

/**
 * @brief 处理存款操作
 * @param bankSystem 银行系统实例
 * @param uiManager UI管理器实例
 * @param accountId 账户ID
 * @return 操作是否成功
 */
bool handleDepositOperation(BankSystem& bankSystem, UIManager& uiManager, const std::string& accountId);

/**
 * @brief 处理取款操作
 * @param bankSystem 银行系统实例
 * @param uiManager UI管理器实例
 * @param accountId 账户ID
 * @return 操作是否成功
 */
bool handleWithdrawOperation(BankSystem& bankSystem, UIManager& uiManager, const std::string& accountId);

/**
 * @brief 处理客户注册
 * @param bankSystem 银行系统实例
 * @param uiManager UI管理器实例
 */
void handleCustomerRegistration(BankSystem& bankSystem, UIManager& uiManager);

/**
 * @brief 处理客户访问
 * @param bankSystem 银行系统实例
 * @param uiManager UI管理器实例
 * @param authManager 认证管理器实例
 */
void handleCustomerAccess(BankSystem& bankSystem, UIManager& uiManager, AuthManager& authManager);

/**
 * @brief 处理显示所有账户
 * @param bankSystem 银行系统实例
 * @param uiManager UI管理器实例
 */
void handleDisplayAllAccounts(BankSystem& bankSystem, UIManager& uiManager);

/**
 * @brief 处理交易报告
 * @param bankSystem 银行系统实例
 * @param uiManager UI管理器实例
 */
void handleTransactionReports(BankSystem& bankSystem, UIManager& uiManager);

/**
 * @brief 主函数
 * @return 退出码
 */
int main();

#endif // MAIN_HH 